原文連結:Working with Complex Internal Tables
僅需存取單一一筆資料時,可使用SINGLE
關鍵字讀取一筆紀錄,結合structure存入該筆資料。
"建立structure"
DATA airport_full TYPE /DMO/I_Airport.
"關鍵字SINGLE僅回傳第一筆搜尋到的值"
SELECT SINGLE
FROM /DMO/I_Airport
FIELDS AirportID, Name, City, CountryCode
WHERE City = 'Zurich'
"存入structure"
INTO @airport_full.
如果想存取所有符合條件的搜尋結果,可以不使用SINGLE
關鍵字,並且用Internal Table接收多筆資料,並且INTO
後方需加上TABLE
關鍵字。
"建立Internal Table"
DATA airport_full TYPE STANDARD TABLE OF /DMO/I_Airport
WITH NON-UNIQUE KEY AirportID.
"關鍵字SINGLE僅回傳第一筆搜尋到的值"
SELECT
FROM /DMO/I_Airport
FIELDS AirportID, Name, City, CountryCode
WHERE City = 'London'
"存入Internal Table"
INTO TABLE @airport_full.
如上例,假設符合與倫敦相關聯的機場有三個,三個結果皆會依序存入Internal Table。
另外,除了明確指出欲搜尋的欄位,也可以用先前提過的別名、*
等指定搜尋條件,用INTO CORRESPONDING FIELDS OF TABLE
自動對應欄位順序
另外,也能用DATA()
建立行內Internal Table元素,其欄位會根據FIELDS
的搜尋條件自動生成。注意,如果INTO後面接的是行內宣告,別名AS
是必要的,並且 INTO CORRESPONDING FIELDS OF TABLE
不適用行內宣告。
雖然宣告行內Internal Table很方便,但這種方法只能生成標準表格,排序及雜湊表格皆不適用,如果有效能考量且需要大量用鍵值做搜尋,會較不建議使用行內宣告Internal Table。
UNION
是SQL的關鍵字,我們可以用UNION
組合多個SELECT
的搜尋結果。
如下圖,用第一個SELECT
存取左側表格符合CURRENCY_CODE = 'GBP'
的航空公司ID與名稱(一筆)。再用第二個SELECT
存取右側表格CITY = 'London'
的所有機場ID與名稱(三筆)。此時可以用UNION
將這些搜尋結果合併成一組共四筆的搜尋結果。
先決條件是兩個結果的欄位名稱及欄位長度需要是相同的,型別則是相同會更好但非必須。
"第一個SELECT"
SELECT FROM /DMO/I_Carrier
FIELDS 'Airline' AS type, Airline_ID AS ID, Name
WHERE CurrentyCode = 'GBP'
INTO TABLE @DATA(Names).
UNION ALL
"第二個SELECT"
SELECT FROM /DMO/I_Airport
FIELDS 'Airport' AS type, Airline_ID AS ID, Name
WHERE City = 'London'
"合併結果至表格Names"
INTO TABLE @DATA(Names).
上例語法由兩個SELECT
組成,各自有 FROM
、FIELDS
和 WHERE
關鍵字,但只有一個INTO
,並用UNION ALL
連接。
第一欄的TYPE用來區別該筆資料是航空公司還是機場。兩張表都包含三個欄位,前兩欄有先在FIELDS
中進行別名處理使名稱一致,第三欄的Name
則是原本兩張表就叫一樣,所以不須另取別名。
下一章要來介紹Business Object(BO)啦~